package web.stu.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import web.stu.model.dto.user.*;
import web.stu.model.entity.User;
import web.stu.model.vo.UserVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author administer
 * @description 针对表【user(用户表)】的数据库操作Service
 * @createDate 2025-05-13 19:55:26
 */
public interface UserService extends IService<User> {
    /**
     * 用户登录（公共）
     *
     * @param loginDTO
     * @return
     */
    UserVO login(LoginDTO loginDTO, HttpServletRequest request);

    /**
     * 用户注册（公共）
     *
     * @param registerDTO
     * @return
     */
    UserVO register(RegisterDTO registerDTO);

    /**
     * 查看当前登录用户（已登录）
     *
     * @param request
     * @return
     */
    UserVO currentLoginUser(HttpServletRequest request);

    /**
     * 退出登录（公共）
     *
     * @param request
     */
    void logout(HttpServletRequest request);


    /**
     * 根据id获取用户信息（仅自己/管理员）
     *
     * @param id      用户id
     * @param request
     * @return
     */
    UserVO getUserById(Integer id, HttpServletRequest request);

    /**
     * 查看所有用户信息 模糊查询 分页展示（仅教师或管理员）
     *
     * @param queryUserDTO
     * @param request
     * @return
     */
    Page<UserVO> listUsers(QueryUserDTO queryUserDTO, HttpServletRequest request);

    /**
     * 修改用户信息（仅当前用户和管理员）
     *
     * @param updateUserDTO
     * @param request
     * @return
     */
    UserVO updateUser(UpdateUserDTO updateUserDTO, HttpServletRequest request);

    /**
     * 删除用户（仅管理员）
     *
     * @param id
     * @param request
     * @return
     */
    Boolean deleteUserById(Integer id, HttpServletRequest request);

    /**
     * 判断是否为对应权限
     *
     * @param user 当前用户
     * @param role 权限
     * @return
     */
    Boolean isCompareRole(User user, String role);


    /**
     * 获取登录用户，系统内部使用
     *
     * @param request
     * @return
     */
    User getLoginUser(HttpServletRequest request);


    /**
     * 添加学生
     *
     * @param addUserDTO
     * @param request
     * @return
     */
    UserVO addUser(AddUserDTO addUserDTO, HttpServletRequest request);

    /**
     * 根据班级id查询学生
     *
     * @param classId
     * @param request
     * @return
     */
    List<UserVO> getUsersByClassId(Integer classId, HttpServletRequest request);

}
